CodevisionAVR là một công cụ để gen code rất tốt dùng cho VĐK AVR. Không cần phải bàn nhiều về tính năng hấp dẫn của soft này. Nếu bạn muốn đi nhanh vào ứng dụng và ít quan tâm tới các register thì CodevisionAVR có lẽ là một lựa chọn hợp lý. Vì đang sử dụng soft V2.03.4 cũng không rõ trong các version mới hơn đã có những tính năng nào hấp dẫn hơn không, nhưng cũng có một nhận xét về một số điểm còn hạn chế. Khá rõ ràng là việc thư viện LCD có nhưng còn hạn chế. Bạn khá bị động trong việc chọn các chân để giao tiếp với LCD. Thường thì tất cả là các chân PORTB hoặc PORTD v.v… Do đó dựa vào code có khá nhiều cho LCD viết cho CCS, mình recode lại cho LCD (16×2), chỉ cần chỉnh sửa một chút trong khai báo các chân điều khiển và dữ liệu bạn sẽ có thể điều khiển LCD theo ý mình. Vì luôn có mục đích tiếp cận chân nên mình code cho giao tiếp 4 bit và cũng bởi lẽ giao tiếp 8 bit quá đơn giản với bạn nếu bạn muốn code một code mới rồi.
/*
Recoded by TrungTQ
Email: trungkstn@gmail.com
*/
/*=================================================*/
#include <string.h>
#include <delay.h>
#include <stdio.h>
#include <stdarg.h>
/*=================================================*/
#define LCD_RS PORTC.0
#define LCD_EN PORTC.1
/*=================================================*/
#define LCD_D4 PORTC.2
#define LCD_D5 PORTC.3
#define LCD_D6 PORTC.4
#define LCD_D7 PORTC.5
/*=================================================*/
unsigned char Testbit(unsigned char Data, unsigned char i)
{
if((Data & i) == i) return 1;
return 0;
}
/*==================================================*/
void LCD_Init();
void LCD_GotoXY(unsigned char x, unsigned char y);
void LCD_PutChar(unsigned char c);
void LCD_PutFlashString(flash unsigned char* str);
void LCD_PutString(unsigned char* str);
void LCD_Clear();
void LCD_SetData(unsigned char Data);
void LCD_SendData(unsigned char Data);
/*==================================================*/
void LCD_Pulse()
{
LCD_EN = 1;
delay_ms(5);
LCD_EN = 0;
delay_ms(5);
}
/*==================================================*/
void LCD_SetData(unsigned char Data)
{
LCD_D4 = Testbit(Data, 1);
LCD_D5 = Testbit(Data, 2);
LCD_D6 = Testbit(Data, 4);
LCD_D7 = Testbit(Data, 8);
}
/*==================================================*/
void LCD_SendData(unsigned char Data)
{
LCD_SetData((Data>>4) & 0x0F);
LCD_Pulse();
LCD_SetData(Data & 0x0F);
LCD_Pulse();
}
/*==================================================*/
void LCD_Init()
{
LCD_RS = 0;
LCD_EN = 1;
LCD_Pulse();
delay_ms(10);
LCD_SetData(0x02);/* Mode 4 bits */
LCD_Pulse();
LCD_SendData(0x28);/* Mode 4 bits 2 lines */
LCD_SendData(0x0C);
LCD_SendData(0x06);
LCD_SendData(0x02);
LCD_Clear();
}
/*==================================================*/
void LCD_Clear()
{
LCD_SendData(0x01);
}
/*==================================================*/
void LCD_GotoXY(unsigned char x, unsigned char y)
{
LCD_SendData((x-1) + 64*(y-1) + 0x80);
}
/*==================================================*/
void LCD_PutChar(unsigned char c)
{
LCD_RS = 1;
LCD_SendData(c);
LCD_RS = 0;
}
/*==================================================*/
unsigned char strlen2(flash unsigned char *s)
{
flash unsigned char *sc;
for (sc = s; *sc != 0; sc++);
return(sc - s);
}
/*==================================================*/
void LCD_PutFlashString(flash unsigned char* str)
{
int i;
for(i = 0; i < strlen2(str); i++)
{
LCD_PutChar(str[i]);
}
}
/*==================================================*/
void LCD_PutString(unsigned char* str)
{
int i;
for(i = 0; i < strlen(str); i++)
{
LCD_PutChar(str[i]);
}
}
/*==================================================*/