[求助] 按键控制8X8LED点阵屏显示图形 程序的几个问题

QWE4562009   2020-7-6 11:35 楼主

/*    名称:按键控制8X8LED点阵屏显示图形
    说明:每次按下K1时,会使8X8LED点阵屏循环显示不同图形。
          本例同时使用外部中断和定时中断。
*/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//待显示图形编码
uchar code M[][8]=
{
    {0x00,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x00},        //图1
    {0x00,0x38,0x44,0x54,0x44,0x38,0x00,0x00},        //图2
    {0x00,0x20,0x30,0x38,0x3c,0x3e,0x00,0x00}        //图3
};
uchar i,j;
//主程序
void main()
{
    P0=0xff;
    P1=0xff;                
    TMOD=0x01;                //T0方式1
    TH0=(65536-2000)/256;    //2ms定时
    TL0=(65536-2000)%256;
    IT0=1;                    //下降沿触发
    IE=0x83;                //允许定时器0、外部0中

    i=0xff;                    //i的初值设为0xff,加1
后将从0开始
    while(1);
}
//T0中断控制点阵屏显示
void Show_Dot_Matrix() interrupt 1
{
    TH0=(65536-2000)/256;    //恢复初值
    TL0=(65536-2000)%256;
    P0=0xff;                //输出位码和段码
    P0=~M[i][j];
    P1=_crol_(P1,1);        
    j=(j+1)%8;
}
//INT0中断(定时器由键盘中断启动)
void Key_Down() interrupt 0
{
    P0=0xff;
    P1=0x80;
    j=0;
    i=(i+1)%3;                //i在0,1,2中取值,因为只要3个图形

 

 

 

问题如下
1.P0=0xff;P1=0xff-------这条语句是端口初始化不?

2.IE=0x83 ---- 1000 0011为什么是这个值?寄存器配置?

3.P0=0xff;                
  P0=~M[i][j];
  P1=_crol_(P1,1);        
  j=(j+1)%8;-----------------P0赋初值?P0给值?后面的就看不懂了

4.我用proteus仿真试了下,只有在按键按下的时候,才会显示图形,这样就是外
部中断。那定制器中断有何意义呢?

5.i=(i+1)%3---------为什么要(i+1)%3这样一个表达式再赋值给i呢?
 

回复评论 (64)

"IE=0x83 ---- 1000 0011为什么是这个值?寄存器配置?"

你那段程序中的注解里面已经说明了:

IE=0x83;                //允许定时器0、外部0中断

 

点赞  2020-7-6 11:44

“P0=0xff;P1=0xff-------这条语句是端口初始化不?”

是端口初始化。但51单片机上电复位后端口为高电平,这两句可以去掉不用。更何况定时器中断和外部中断程序里面都有 P0=0xff 这句。

点赞 (1) 2020-7-6 11:48

“那定制器中断有何意义呢?”

P0口每次只能输出一个字节,即8X8点阵的一行。而8X8点阵共8行。

点赞  2020-7-6 11:51

未按键时,第一次定时器中断,显示的是0x00,第二次定时器中断,显示的是,0x7e,的三次定时器中断,显示的是,0x7e……一直到第八次,显示的是0X00。

 j=(j+1)%8;就是为了显示下一个数据。

按键后,第一次定时器中断显示的是0X00,第二次定时器中断,显示的是0X38,第三次定时器中断,显示的是0X44……

点赞 (1) 2020-7-6 12:15
引用: maychang 发表于 2020-7-6 11:44 "IE=0x83 ---- 1000 0011为什么是这个值?寄存器配置?" 你那段程序中的注解里面已经说明了: IE ...

这是5 1单片机  对应的哪个寄存器控制?

点赞  2020-7-6 17:35
引用: maychang 发表于 2020-7-6 12:15 未按键时,第一次定时器中断,显示的是0x00,第二次定时器中断,显示的是,0x7e,的三次定时器中断,显示的 ...

第三次不应该是0XF2?

点赞  2020-7-6 17:40
引用: maychang 发表于 2020-7-6 12:15 未按键时,第一次定时器中断,显示的是0x00,第二次定时器中断,显示的是,0x7e,的三次定时器中断,显示的 ...

0X38-----是怎么来的

点赞  2020-7-6 17:40
引用: QWE4562009 发表于 2020-7-6 17:35 这是5 1单片机  对应的哪个寄存器控制?

"对应的哪个寄存器控制?"

就是IE,中断寄存器。地址0XA8。

点赞  2020-7-6 18:02
引用: QWE4562009 发表于 2020-7-6 17:40 0X38-----是怎么来的

在1楼你贴出的是【 IE=0x83;                //允许定时器0、外部0中断】

不是0X38。

点赞  2020-7-6 18:04
引用: QWE4562009 发表于 2020-7-6 17:40 0X38-----是怎么来的

!!2.png

就是这么来的。

点赞  2020-7-6 18:08
引用: QWE4562009 发表于 2020-7-6 17:40 0X38-----是怎么来的

把0X83写成二进制,一位一位地对应11楼中图片中IE寄存器各位功能,就明白是怎么来的了。

点赞  2020-7-6 18:10
引用: QWE4562009 发表于 2020-7-6 17:40 第三次不应该是0XF2?

在1楼,没有找到0XF2。

点赞  2020-7-6 18:16
引用: maychang 发表于 2020-7-6 18:10 把0X83写成二进制,一位一位地对应11楼中图片中IE寄存器各位功能,就明白是怎么来的了。

按键后,第一次定时器中断显示的是0X00,第二次定时器中断,显示的是0X38,第三次定时器中断,显示的是0X44……-----------我说的是这里的0X38怎么来的

点赞  2020-7-6 18:18
引用: maychang 发表于 2020-7-6 12:15 未按键时,第一次定时器中断,显示的是0x00,第二次定时器中断,显示的是,0x7e,的三次定时器中断,显示的 ...

P0=~M[j];
  P1=_crol_(P1,1);        
  j=(j+1)%8   这三个语句再详细的讲下啊  老师

点赞  2020-7-6 18:23
引用: QWE4562009 发表于 2020-7-6 18:18 按键后,第一次定时器中断显示的是0X00,第二次定时器中断,显示的是0X38,第三次定时器中断,显示的是0X ...

!!38.png

你是说这个0X38?

点赞  2020-7-6 18:26
引用: QWE4562009 发表于 2020-7-6 18:23 P0=~M[j];   P1=_crol_(P1,1);           j=(j+1)%8   ...

!!ij.png 没有 P0=~M[j]; 这句。

点赞  2020-7-6 18:34
引用: maychang 发表于 2020-7-6 18:34 没有 P0=~M[j]; 这句。

对  我要说的是这个

点赞  2020-7-6 18:39
引用: maychang 发表于 2020-7-6 18:26 你是说这个0X38?

恩  为什么第一行数组的值是0X00 接下来都是0X7?而第二行和第三行那些数组的元素是那样的值  我想知道怎么算的

点赞  2020-7-6 18:41
引用: QWE4562009 发表于 2020-7-6 18:41 恩  为什么第一行数组的值是0X00 接下来都是0X7?而第二行和第三行那些数组的元素是那样的值   ...

这是你copy的程序中数组内容,不是算出来的,是程序编写者自己根据要显示的图形而定的。

点赞  2020-7-6 18:48
1234下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复