单片机lcd画圆环代码
时间: 2023-07-09 16:46:22 浏览: 212
基于单片机的液晶屏代码
这里提供一个使用Bresenham算法绘制圆环的示例代码,适用于STC89C52RC单片机和AT070TN83 LCD屏幕:
```c
#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
#define LCD_DATA P2
sbit LCD_RS = P1^0;
sbit LCD_RW = P1^1;
sbit LCD_EN = P1^2;
void delay(u16 i) {
while(i--);
}
void lcd_write_cmd(u8 cmd) {
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 1;
_nop_();
LCD_DATA = cmd;
delay(100);
LCD_EN = 0;
}
void lcd_write_data(u8 dat) {
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 1;
_nop_();
LCD_DATA = dat;
delay(100);
LCD_EN = 0;
}
void lcd_init() {
lcd_write_cmd(0x38); // 设置16x2显示,5x8点阵
lcd_write_cmd(0x0c); // 开显示,不显示光标
lcd_write_cmd(0x06); // 设置光标移动方向,右移
lcd_write_cmd(0x01); // 清屏
}
void lcd_display_char(u8 x, u8 y, u8 ch) {
u8 addr;
if (y == 0) {
addr = x;
} else {
addr = 0x40 + x;
}
lcd_write_cmd(0x80 + addr);
lcd_write_data(ch);
}
void lcd_display_string(u8 x, u8 y, u8 *str) {
while(*str != '\0') {
lcd_display_char(x, y, *str++);
x++;
}
}
void lcd_draw_circle(u8 x0, u8 y0, u8 r, u8 w) {
u8 x = r;
u8 y = 0;
u8 err = 0;
while(x >= y) {
// 画圆环上的8个点
lcd_display_char(x0 + x, y0 + y, '*');
lcd_display_char(x0 + y, y0 + x, '*');
lcd_display_char(x0 - y, y0 + x, '*');
lcd_display_char(x0 - x, y0 + y, '*');
lcd_display_char(x0 - x, y0 - y, '*');
lcd_display_char(x0 - y, y0 - x, '*');
lcd_display_char(x0 + y, y0 - x, '*');
lcd_display_char(x0 + x, y0 - y, '*');
y++;
err += 1 + 2 * y;
if (2 * (err - x) + 1 > 0) {
x--;
err += 1 - 2 * x;
}
}
// 画圆环的线宽
x = r - w;
y = 0;
err = 0;
while(x >= y) {
// 画圆环上的8个点
lcd_display_char(x0 + x, y0 + y, '*');
lcd_display_char(x0 + y, y0 + x, '*');
lcd_display_char(x0 - y, y0 + x, '*');
lcd_display_char(x0 - x, y0 + y, '*');
lcd_display_char(x0 - x, y0 - y, '*');
lcd_display_char(x0 - y, y0 - x, '*');
lcd_display_char(x0 + y, y0 - x, '*');
lcd_display_char(x0 + x, y0 - y, '*');
y++;
err += 1 + 2 * y;
if (2 * (err - x) + 1 > 0) {
x--;
err += 1 - 2 * x;
}
}
}
void main() {
lcd_init();
lcd_display_string(0, 0, "Draw Circle Demo");
lcd_draw_circle(80, 32, 30, 5); // 画半径为30,线宽为5的圆环
while(1);
}
```
该代码使用的是16x2字符LCD屏幕,可以根据需要进行调整。在绘制圆环时,先使用Bresenham算法计算出圆环上每个点的坐标,然后根据线宽绘制出圆环。最后将绘制好的图形显示在LCD上即可。
阅读全文