/* 名称:按键控制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呢?
“P0=0xff;P1=0xff-------这条语句是端口初始化不?”
是端口初始化。但51单片机上电复位后端口为高电平,这两句可以去掉不用。更何况定时器中断和外部中断程序里面都有 P0=0xff 这句。
未按键时,第一次定时器中断,显示的是0x00,第二次定时器中断,显示的是,0x7e,的三次定时器中断,显示的是,0x7e……一直到第八次,显示的是0X00。
j=(j+1)%8;就是为了显示下一个数据。
按键后,第一次定时器中断显示的是0X00,第二次定时器中断,显示的是0X38,第三次定时器中断,显示的是0X44……
引用: maychang 发表于 2020-7-6 11:44 "IE=0x83 ---- 1000 0011为什么是这个值?寄存器配置?" 你那段程序中的注解里面已经说明了: IE ...
这是5 1单片机 对应的哪个寄存器控制?
引用: maychang 发表于 2020-7-6 12:15 未按键时,第一次定时器中断,显示的是0x00,第二次定时器中断,显示的是,0x7e,的三次定时器中断,显示的 ...
第三次不应该是0XF2?
引用: maychang 发表于 2020-7-6 12:15 未按键时,第一次定时器中断,显示的是0x00,第二次定时器中断,显示的是,0x7e,的三次定时器中断,显示的 ...
0X38-----是怎么来的
引用: QWE4562009 发表于 2020-7-6 17:40 0X38-----是怎么来的
把0X83写成二进制,一位一位地对应11楼中图片中IE寄存器各位功能,就明白是怎么来的了。
引用: QWE4562009 发表于 2020-7-6 17:40 第三次不应该是0XF2?
在1楼,没有找到0XF2。
引用: maychang 发表于 2020-7-6 18:10 把0X83写成二进制,一位一位地对应11楼中图片中IE寄存器各位功能,就明白是怎么来的了。
按键后,第一次定时器中断显示的是0X00,第二次定时器中断,显示的是0X38,第三次定时器中断,显示的是0X44……-----------我说的是这里的0X38怎么来的
引用: maychang 发表于 2020-7-6 12:15 未按键时,第一次定时器中断,显示的是0x00,第二次定时器中断,显示的是,0x7e,的三次定时器中断,显示的 ...
P0=~M[j];
P1=_crol_(P1,1);
j=(j+1)%8 这三个语句再详细的讲下啊 老师
引用: QWE4562009 发表于 2020-7-6 18:18 按键后,第一次定时器中断显示的是0X00,第二次定时器中断,显示的是0X38,第三次定时器中断,显示的是0X ...
你是说这个0X38?
引用: QWE4562009 发表于 2020-7-6 18:23 P0=~M[j]; P1=_crol_(P1,1); j=(j+1)%8 ...
引用: maychang 发表于 2020-7-6 18:34 没有 P0=~M[j]; 这句。
对 我要说的是这个
引用: maychang 发表于 2020-7-6 18:26 你是说这个0X38?
恩 为什么第一行数组的值是0X00 接下来都是0X7?而第二行和第三行那些数组的元素是那样的值 我想知道怎么算的
引用: QWE4562009 发表于 2020-7-6 18:41 恩 为什么第一行数组的值是0X00 接下来都是0X7?而第二行和第三行那些数组的元素是那样的值 ...
这是你copy的程序中数组内容,不是算出来的,是程序编写者自己根据要显示的图形而定的。