急求结果 有懂AVR单片机编写的液晶显示程序的请进来指点

2024-12-21 02:58:06
推荐回答(3个)
回答1:

你这个液晶屏不是一般开发板能带有的。大致读了一下:
#include #include "board.h" #include "manage.h"//调用头文件 #include "scan.h" #include "timer.h" #include "lcd.h"

void sys_init(void);
void bus_reset(void);
int main(void) //主程序
{ uint8_t i = 0; //这里定义了一个计数器,用于指示灯闪烁计时用
sys_init(); //系统初始化,具体程序在下面
int_init(); //又初始化了一个什么东西,先不管
// timer0_init(); //没有用到time0
timer1_init(); //time1初始化,但是就现有程序而言还无法知道计时周期
// timer2_init();
// adc_init();
wdt_disable(); //先禁用看门狗
wdt_enable(WDTO_250MS); //设置看门狗250ms为一周期
wdt_reset(); //复位看门狗
sei(); //禁用中断
// 初始化LCD
lcd_init(); //调用液晶屏初始化程序
while(1) //主程序循环
{ manage(); //应该是处理液晶显示内容用的子程序
if (i & 0x10)
LED_ON(); //0x10个周期后LED闪烁
else
LED_OFF();
i++;
delay_ms(10);
wdt_reset(); //复位看门狗
}
}
// 系统初始化
void sys_init(void) //系统初始化子程序的详细内容(看来只定义了IO口还真不知道这个系统内单片机的定时器如何初始化的)
{
PORTA = 0xf2; //定义IO口
DDRA = 0x0a; // PA7~PA4 键盘输入,PA3: LCD_A0复用电池测量时,输出1
// PA2: 输入,测电池电压, PA1:LCD_CS, PA0:输入,测总线电压?
PORTB = 0xff;
DDRB = 0x00; // PB输出,LCD_DB,PB0~PB4 KEY SCAN
PORTC = 0x80;
DDRC = 0xc0; // PC输出,PC7:LCD_RST,PC6:LCD_LED+,

PORTD = 0x03;
DDRD = 0xf3; // PD7:PWM,PD6:ZL,PD5:ZH,PD4:LED
// PD3返回,PD2开关, PD1:LCD_RD, PD0:LCD_WR
}
void lcd_init(void) //LCD的初始化
{
uint8_t i;

LCD_RST_L(); //应该是复位LCD
delay_ms(2); //延时
LCD_RST_H(); //复位完毕,该复位引脚拉高
for (i=0; i<8; i++) //复位8次看门狗?
{
delay_ms(20);
wdt_reset();
}
write_cmd(0xe2);//system reset 24 //写一个复位命令?
delay_ms(10);
write_cmd(0xeb);//set bias RATIO=1/12 27 =E8 FOR LOW POWER //设置液晶屏偏压
write_cmd(0x81);//set refence voltage ;pm 11 DOUBLE command ?//设置参考电压
write_cmd(0x83);//set RGB ? D1 21 //设置RGB方式?
write_cmd(0x2f);//set color mode,65K 22 D4 FOR 256 COLOR 3r-3g-2b//设置彩色显示深度
write_cmd(0x2b);//set line rate,35.8kps 15 A3?//设置啥?不是很明白
write_cmd(0x24);//set n-line ? 5,Temp.Compensation 00//设置某种补偿?
write_cmd(0xa2); // 15 set line rate 29.6k
write_cmd(0xd0);//set partial display? 21 D0 BGR//设置一个副屏幕?或许这个彩屏还附带一个小屏幕?
write_cmd(0xd6);//set cen? 22 d6 64k color 5-6-5//不明白
write_cmd(0xc0); // 19 LC[2:0]
write_cmd(0xaf); //set display on 18, DC[4:2]=111//仍然不明白
delay_ms(10);
wdt_reset();//重启看门狗
}
void write_cmd(uint8_t cmd)//“写命令”子程序
{
LCD_A0_L();//应该是拉低“命令\数据”引脚的电平
LCD_CS_L(); //片选引脚
PORTB = cmd; //PORTB的8个引脚作为并行口向液晶屏输出数据
DDRB = 0xff; //PORTB的方向定义为输出
LCD_WR_L(); //写LCD引脚电平拉低,看来这程序可能是为了防止被中断或者别的情况打乱,特地发送了两遍
LCD_WR_L();
LCD_WR_H();
LCD_CS_H();
DDRB = 0; //改PORTB为高阻态
//个人觉得后面应该还需要两个语句:LCD_CS_H();和LCD_A0_H();已完成一个“写命令”周期
}

总之,你这块液晶屏应该在市场上不常见。要用这个玩意,你必须有对应这块液晶屏的详细文档、数据手册,否则光这么一个程序很难把这个液晶屏玩转了。

回答2:

买个仿真机,一切解决,其他人帮你也需要用到

回答3:

先学8051系列的吧,学好后再学avr