⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 用来显示LCM103的单片机程序。非常好的例子
💻 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 + -