部分思路:
码表table={2码表,3码表};//table(0)和table(1)是2和3的显示。
提前声明 k=0;
位选选中第一位;
while(1)
{if(判断20)
{
k=~k;
P=table(k);
}
}
或者
if(判断20)
{
if 当前是显示2
P=3段码;
else
P=2段码;
}
参考GPT和自己的思路:根据您提供的思路,实现1.5秒循环显示2-3-2-3的代码如下:
// 定义码表
unsigned char table[2]={0xC0, 0xF3}; // table(0)和table(1)分别对应2和3的显示
// 定义计数器初始值和位选序号
unsigned char count = 0;
unsigned char num_index = 0;
void main()
{
TMOD = 0x10; // 定时器1工作方式1
TH1 = 0xFC; // 定时器1: 1.5s
TL1 = 0x66;
ET1 = 1; // 开启定时器1中断
EA = 1; // 开启总中断
TR1 = 1; // 启动定时器1
while(1) {
// 判断是否到达20ms
if (count >= 100) {
count = 0; // 计数器清零
// 根据位选序号显示数字
switch(num_index) {
case 0: P1 = table[0]; break;
case 1: P1 = table[1]; break;
case 2: P1 = table[0]; break;
case 3: P1 = table[1]; break;
default: break;
}
// 下一位选中
num_index = (num_index + 1) % 4;
}
}
}
// 定时器1中断函数
void timer1() interrupt 3 {
TH1 = 0xFC; // 重新装载初值
TL1 = 0x66;
count++; // 计数器自增
}
首先定义码表,然后在主函数中设置定时器1,开启定时器1中断和总中断。在一个无限循环中判断是否到达20ms触发的定时器1中断,若到达,则根据位选序号选择显示对应的数字,并将位选序号加1,实现循环显示2-3-2-3的效果。
不知道你这个问题是否已经解决, 如果还没有解决的话: