数码管动态显示:
回想一下lesson4最后那个exam,765432,每隔1s减减,与此同时流水灯,减到764398,停;数码管闪烁,3s后熄灭,同时数码管点亮HELLO
T0/T1定时器,中断是重点,也设置了标志位,最开始自己写程序的时候,主要卡在最后数码管如何点亮输出HELLO这里。是标志位没设置好。
1在中断里面判断跟在主函数里面判断是不一样的,判断啥?判断num_du与num_we的值
2消隐与动态显示效果
wela = 1;
P0 = 0xf7;
wela = 0;
P0 = 0;
dula = 1;
P0 = table_du[a/100];
dula = 0;
delay(2);
wela = 1;
P0 = 0xef;
wela = 0;
P0 = 0;
dula = 1;
P0 = table_du[(a%100)/10];
dula = 0;
delay(2);
(1)
这里的P0 = 0用于dula(段选)开启的时候P0的上次初始值为0(共阴极数码管给0x00,即数码管什么也不显示),不然就是wela(位选)打开的时候送的0xf7这个值
(2)
delay(2)在这里是控制两个数码点亮的间隔,即动态显示效果,看起来就像同时控制几个数码管一样。delay(2)人眼看着已经没有闪烁感了,delay(5)稍微还有一点;在显示6位数765432的时候还调小了delay(uchar z)里面的x值,使其闪烁更快
可以尝试拉长这个值,比如延时1s/delay(1000),那么第一个数码管点亮1s之后,熄灭,同时第二个数码管亮;第二个数码管点亮1s之后,熄灭,同时第3个数码管亮
矩阵键盘:
key_scan()函数,带return 值的写法,以前没有完整写过,自己写的时候主要卡在无键按下的时候,数码管上有输出;然后是松手检测不会写:
while( temp != 0xf0)
{
temp = P3;
temp = temp & 0xf0;
}
以上就是松手检测的思路:键盘按下的时候temp肯定不等于0xf0,while表达式为真,始终在循环内部,一旦松手,此时读到P3口的值(因为松手了,读到的P3^7~P3^4全为高)送给temp再与0xf0相与,值肯定就等于0xf0了,此时,while(0xf0 != 0xf0)为假,跳出while循环
自己写的时候,不知道display()写哪里?