📄 main.c
字号:
#include "./main.h"
#include <avr/io.h>//define kind of I/O port
#include <avr/delay.h>//define _delay_loop_2
#include <inttypes.h>//define uint16_t and so on
void delay(uint16_t ms)
{
uint16_t i;
for(i=0;i<ms;i++) _delay_loop_2(2765);//equal mcu freq/4000
}
void beep(void)
{
uint16_t lasting=1500;
while(lasting--)
{
PORTC ^= _BV(7); //取反
_delay_loop_2(130);
}
}
#define CS0 do{(PORTA &= ~(_BV(7)));}while(0)//is better than (PORTA &= ~(_BV(7)))
#define CS1 do{(PORTA |= (_BV(7)));}while(0)
#define RD0 do{(PORTA &= ~(_BV(6)));}while(0)
#define RD1 do{(PORTA |= (_BV(6)));}while(0)
#define WR0 do{(PORTA &= ~(_BV(5)));}while(0)
#define WR1 do{(PORTA |= (_BV(5)));}while(0)
#define SEND0 do{(PORTA &= ~(_BV(4)));}while(0)
#define SEND1 do{(PORTA |= (_BV(4)));}while(0)
void send(uint16_t senddata,uint8_t num)
{
uint8_t i;
CS1;
delay(10);
CS0;
delay(5);
for(i=0;i<num;i++)
{
WR0;
delay(5);
if(senddata & _BV(i))
SEND1;
else
SEND0;
delay(10);
WR1;
delay(10);
}
SEND1;
CS1;
}
#define LCD_CMD_INITIAL 0x29
#define LCD_CMD_SEL_RC 0x18
#define LCD_CMD_OP_RC 0x01
#define LCD_CMD_OP_LCD 0x03
#define LCD_CMD_CL_LCD 0x02
void lcd_send_bit(uint8_t flag)
{
WR0;
delay(1);
if(flag)
SEND1;
else
SEND0;
WR1;
delay(1);
}
void lcd_send_data(uint8_t addr,uint8_t data)
{
uint8_t i;
CS1;
delay(1);
CS0;
delay(1);
lcd_send_bit(1);
lcd_send_bit(0);
lcd_send_bit(1);
for(i=0;i<6;i++)
{
if(addr & _BV(5-i))
lcd_send_bit(1);
else
lcd_send_bit(0);
}
for(i=0;i<4;i++)
{
if(data & _BV(i))
lcd_send_bit(1);
else
lcd_send_bit(0);
}
CS1;
delay(1);
}
void lcd_send_cmd(uint8_t cmd)
{
uint8_t i;
CS1;
delay(1);
CS0;
delay(1);
lcd_send_bit(1);
lcd_send_bit(0);
lcd_send_bit(0);
for(i=0;i<8;i++)
{
if(cmd & _BV(7-i))
lcd_send_bit(1);
else
lcd_send_bit(0);
}
lcd_send_bit(0);
CS1;
delay(1);
}
void test_lcd(void)
{
uint8_t i,j;
lcd_send_cmd(LCD_CMD_INITIAL);
lcd_send_cmd(LCD_CMD_SEL_RC);
lcd_send_cmd(LCD_CMD_OP_RC);
lcd_send_cmd(LCD_CMD_OP_LCD);
beep();
delay(1000);
/*display S1---S4*/
for(i=0;i<0x20;i++)
{
for(j=0;j<4;j++)
{
lcd_send_data(i,_BV(j));
beep();
delay(1000);
}
}
beep();
delay(200);
beep();
lcd_send_cmd(LCD_CMD_CL_LCD);
}
int main(void)
{
/*PC7 output to speak;PC6 to TP.
PC5~2 correspond to JTAG.only PC4 correspond to JTAG TDO(test data out),should be output MCU.
PC1~0 correspond to color LED,should be output from MCU.*/
DDRA=0xFF;
PORTA=0xFF;
DDRC=0xD3;
PORTC=0x2C;
delay(3000);
while(1)
{
test_lcd();
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -