void WriteNum(uchar row,uchar col,uchar num) { if (row == 1) row = 0x80 + col; else row = 0xC0 + col; writecom(row); PORTD|=(1<<RS); PORTD&=~(1<<RW); PORTD|=(1<<EN); PORTC = num; s_ms(500); PORTD&=~(1<<EN); }中的writecom(row);什么意思
时间: 2024-03-07 20:53:10 浏览: 23
在LCD1602液晶屏上进行操作时,需要发送不同的指令来控制LCD的行为,比如设置光标位置、清屏、打开显示等。这些指令都是通过向LCD的命令寄存器中写入不同的命令码来实现的。
在这个函数中,`writecom(row)`的作用就是向LCD的命令寄存器中写入一个命令码,以设置LCD的光标位置。具体来说,`row`参数用来指定要移动光标到哪一行,`col`参数用来指定要移动到哪一列。函数中第一行的代码通过判断`row`的值,计算出对应的命令码并存储到`row`变量中。然后调用`writecom(row)`函数,将命令码写入LCD的命令寄存器中,以实现光标的移动。
相关问题
void WriteNum(uchar row,uchar col,uchar num) { if (row == 1) row = 0x80 + col; else row = 0xC0 + col; writecom(row); PORTD|=(1<<RS); PORTD&=~(1<<RW); PORTD|=(1<<EN); PORTC = num; s_ms(500); PORTD&=~(1<<EN); }为什么这样就可以写入进去
这段代码是用来在LCD1602液晶屏上显示数字的函数。具体来说,通过设置LCD的行和列,将光标移动到指定位置,然后将数字写入LCD的数据寄存器中,最后通过控制LCD的使能引脚,将数据写入LCD中。
其中,PORTD控制LCD的RS、RW、EN引脚,PORTC用来传输数据。RS引脚用来选择写入命令还是写入数据,RW引脚用来选择读取还是写入操作,EN引脚用来控制LCD的使能。函数中的s_ms(500)是通过延时函数产生的一个短暂的脉冲,用来触发LCD的写入操作。
总的来说,这段代码的实现原理是通过控制LCD的引脚和数据传输来实现数字显示的功能。
stc89c52 上电后数码管显示数值“ 9999”。 每按一次按键K1,显示的数值加1,最大为“99999999”。 每按一次按键K2,显示的数值减1,最小为0。 按住K1不放,则数值连续加1;而按住K2不放,则数值连续减1。 要求显示高位灭0
好的,这个问题需要用到单片机的IO口、定时器和中断。首先,需要初始化IO口和定时器,以及使能外部中断。
在程序中,可以通过判断按键的状态,来实现按键功能的不同。当按键被按下时,会触发外部中断,并执行中断服务程序。在中断服务程序中,可以根据按键的状态来改变数码管的显示值。
以下是一个简单的示例程序,你可以根据自己的需要进行修改:
```
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit KEY1 = P1^0; // 按键K1
sbit KEY2 = P1^1; // 按键K2
sbit DIO = P2^0; // 数码管数据口
sbit CLK = P2^1; // 数码管时钟口
sbit STB = P2^2; // 数码管片选口
uchar code ledChar[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; // 数码管显示字符数组
uint num = 9999; // 初始显示值
void delay(uint ms) {
uint i, j;
for(i = ms; i > 0; i--)
for(j = 110; j > 0; j--);
}
void display(uchar dat) {
uchar i;
for(i = 0; i < 8; i++) {
DIO = dat & 0x01;
dat >>= 1;
CLK = 1;
CLK = 0;
}
}
void writeByte(uchar addr, uchar dat) {
STB = 0;
display(addr);
display(dat);
STB = 1;
}
void writeNum(uint num) {
uchar i, j, k, dat[8];
for(i = 0; i < 8; i++) {
dat[i] = num % 10;
num /= 10;
if(num == 0)
break;
}
for(j = 0, k = i; j < 4 && k >= 0; j++, k--)
writeByte(j+1, ledChar[dat[k]]);
for(; j < 4; j++)
writeByte(j+1, 0xC0); // 高位灭0
}
void initTimer() {
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = 0xFC;
TL0 = 0x67;
ET0 = 1;
TR0 = 1;
EA = 1;
}
void main() {
uchar key1State = 0, key2State = 0;
initTimer();
writeNum(num);
while(1) {
if(!KEY1) { // 按键K1被按下
delay(10);
if(!KEY1) {
key1State = 1;
if(num < 99999999)
num++;
writeNum(num);
}
} else {
key1State = 0;
}
if(!KEY2) { // 按键K2被按下
delay(10);
if(!KEY2) {
key2State = 1;
if(num > 0)
num--;
writeNum(num);
}
} else {
key2State = 0;
}
if(key1State) { // 按键K1被持续按下
delay(10);
if(!KEY1) {
if(num < 99999999)
num++;
writeNum(num);
}
}
if(key2State) { // 按键K2被持续按下
delay(10);
if(!KEY2) {
if(num > 0)
num--;
writeNum(num);
}
}
}
}
void timer0() interrupt 1 {
TH0 = 0xFC;
TL0 = 0x67;
writeNum(num);
}
```
这个程序使用了定时器0,每隔一段时间就会更新数码管的显示值。当按键被按下时,会改变num的值,并更新数码管的显示值。当按键被持续按下时,num的值会不断改变,直到按键被松开。
注意,在程序中,数码管的高位是灭0的,因此需要在显示数值的函数中将高位的数码管设置为0xC0。还需要在程序中添加外部中断服务程序,以便处理按键被按下的事件。
希望这个程序能够帮到你,如果还有什么问题,请随时问我。