DDRAM、CGRAM和CGROM的内存单元的编址方式
时间: 2024-04-26 17:20:52 浏览: 12
在LCD液晶显示屏中,DDRAM、CGRAM和CGROM是三个不同的内存单元,其编址方式如下:
1. DDRAM(Display Data RAM)
DDRAM是LCD液晶显示屏的显示区域,用于存储显示字符的像素点阵数据。DDRAM中一共有80个字符位置,每个字符位置占用8个字节的空间,分别对应8行5列的点阵。DDRAM的编址方式为线性编址,即每个字符位置的地址是连续的,从00H到4FH。其中,00H~13H为第一行,14H~27H为第二行,以此类推。
2. CGRAM(Character Generator RAM)
CGRAM用于存储自定义字符的像素点阵数据。CGRAM中共有8个字符位置,每个字符位置占用8个字节的空间,分别对应8行5列的点阵。CGRAM的编址方式为非线性编址,即每个字符位置的地址是不连续的,需要通过设置CGRAM地址寄存器来选择要写入的地址。CGRAM的地址范围为40H~47H。
3. CGROM(Character Generator ROM)
CGROM用于存储预定义的字符的像素点阵数据,如ASCII码字符。CGROM中共有256个字符位置,每个字符位置占用8个字节的空间,分别对应8行5列的点阵。CGROM的编址方式为非线性编址,即每个字符位置的地址是不连续的,需要通过设置AC寄存器来选择要显示的字符的地址。CGROM的地址范围为00H~FFH。
需要注意的是,在访问DDRAM、CGRAM和CGROM时,需要先通过设置AC寄存器或CGRAM地址寄存器来选择要访问的地址,然后再通过写入或读取数据来进行操作。
相关问题
1.1602LCD内含 个可由用户自定义的5X7的字符发生器CGRAM
1602LCD内含8个可由用户自定义的5X7的字符发生器CGRAM。CGRAM是液晶模块中的一块RAM,用于存放自定义的字符字模。每个字符占用8个字节的存储空间,即5X7的点阵图形,1602LCD中包含了8个这样的存储空间,因此可以定义8个自定义字符。通过向CGRAM中写入相应的数据,就可以定义出自己需要的字符,然后在DDRAM中使用定义好的字符代码进行显示。
51单片机lcd实现时间显示,可调时间和闹钟c语言
以下是一个基于51单片机的LCD实现时间显示、可调时间和闹钟的C语言程序:
```c
#include <reg51.h>
#define LCD_Data_Port P2
#define LCD_Command_Port P3
sbit RS = P0^0;
sbit RW = P0^1;
sbit EN = P0^2;
unsigned char second = 0;
unsigned char minute = 0;
unsigned char hour = 0;
unsigned char alarm_hour = 0;
unsigned char alarm_minute = 0;
unsigned char alarm_flag = 0;
void delay(unsigned int time) {
unsigned int i, j;
for(i = 0; i < time; i++) {
for(j = 0; j < 1275; j++);
}
}
void lcd_write_command(unsigned char command) {
LCD_Data_Port = command;
RS = 0;
RW = 0;
EN = 1;
delay(1);
EN = 0;
}
void lcd_write_data(unsigned char data) {
LCD_Data_Port = data;
RS = 1;
RW = 0;
EN = 1;
delay(1);
EN = 0;
}
void lcd_init() {
lcd_write_command(0x38); // 8-bit data, 2-line display, 5x7 font
lcd_write_command(0x0C); // Display on, cursor off, blink off
lcd_write_command(0x01); // Clear display
lcd_write_command(0x06); // Entry mode: increment, no shift
lcd_write_command(0x80); // Set DDRAM address to 0
}
void display_time() {
lcd_write_command(0x80); // Set DDRAM address to 0
lcd_write_data(hour / 10 + '0');
lcd_write_data(hour % 10 + '0');
lcd_write_data(':');
lcd_write_data(minute / 10 + '0');
lcd_write_data(minute % 10 + '0');
lcd_write_data(':');
lcd_write_data(second / 10 + '0');
lcd_write_data(second % 10 + '0');
}
void display_alarm() {
lcd_write_command(0xC0); // Set DDRAM address to 40
lcd_write_data('A');
lcd_write_data('L');
lcd_write_data('A');
lcd_write_data('R');
lcd_write_data('M');
lcd_write_data(':');
lcd_write_data(alarm_hour / 10 + '0');
lcd_write_data(alarm_hour % 10 + '0');
lcd_write_data(':');
lcd_write_data(alarm_minute / 10 + '0');
lcd_write_data(alarm_minute % 10 + '0');
}
void interrupt timer0_isr() interrupt 1 {
TH0 = 0xFC;
TL0 = 0x67;
second++;
if(second == 60) {
second = 0;
minute++;
if(minute == 60) {
minute = 0;
hour++;
if(hour == 24) {
hour = 0;
}
}
}
}
void main() {
TMOD = 0x01; // Timer0 mode 1: 16-bit timer
TH0 = 0xFC; // Initialize timer0 to generate interrupt every 500ms
TL0 = 0x67;
TR0 = 1; // Start timer0
ET0 = 1; // Enable timer0 interrupt
EA = 1; // Enable global interrupt
lcd_init();
while(1) {
display_time();
if(alarm_flag == 1 && hour == alarm_hour && minute == alarm_minute) {
lcd_init();
display_alarm();
while(1); // Wait for reset
}
if(P1_0 == 0) { // Increment hour
delay(20);
if(P1_0 == 0) {
hour++;
if(hour == 24) {
hour = 0;
}
while(P1_0 == 0);
}
}
if(P1_1 == 0) { // Increment minute
delay(20);
if(P1_1 == 0) {
minute++;
if(minute == 60) {
minute = 0;
}
while(P1_1 == 0);
}
}
if(P1_2 == 0) { // Set alarm
delay(20);
if(P1_2 == 0) {
alarm_hour = hour;
alarm_minute = minute;
alarm_flag = 1;
lcd_init();
display_alarm();
while(P1_2 == 0);
}
}
}
}
```
该程序使用定时器0以1秒为单位跟踪时间,并且可以通过按下按钮来增加小时和分钟,以设置时间和闹钟。如果闹钟时间到达,LCD将显示“ALARM: HH:MM”,并且程序将停止,直到被重置。