课程设计报告
课程设计课题:
AD转换与LCD控制综合应用
一、课程设计工作日自 2026年 1月 19日至 2026年 1 月 23日
二、同组学生:
三、课程设计任务要求(包括课题来源、类型、目的和意义、基本要求、完成时间、主要参考资料等):
课题来源:教师自拟
类型:软件开发
目的和意义:促进学生对ARM处理器系统的进一步理解,熟悉基于硬件平台的软件开发过程。该软件的开发涉及S3C2410处理器硬件初始化以及LCD控制器、AD转换器等外围设备的控制。通过该软件的开发,既能使学生掌握相关硬件的控制知识和编程技巧,更能培养学生的实践能力和独立进行系统开发的能力。
基本要求:程序首先通过AD转换输入实验箱上三个电位器的值,并将三个值分别规范化为0~255范围的数值,然后程序根据这三个值来控制LCD显示不同的颜色,即三个电位器的值代表显示像素R、G、B的值,全屏幕显示该R、G、B值确定的颜色,调整电位器时屏幕颜色实时进行相应变化。
完成时间:2026.1.22 完成作品和课程设计报告,2026.1.23进行答辩。
主要参考资料:
UP-NET ARM2410-S硬件说明书
S3C2410A USER’S MANUAL
课程设计报告:
嵌入式接口技术课程设计
题目
班 级:xxxxxxxx
学 号:xxxxxxxx
姓 名:xxxxxxxx
同组同学:xxxxxxxx
2026.1.22
内容要求:
一、题目
二、目的和意义
三、基本要求
四、控制原理
五、程序设计与实现
1. 程序流程图
2. 关键代码分析
六、总结
——————
代码:#include “../inc/drivers.h”
include “../inc/lib.h”
include
include
include “inc/lcd320.h”
include “inc/macro.h”
include “inc/reg2410.h”
pragma import(__use_no_semihosting_swi) // ensure no functions that use semihosting
void ARMTargetInit(void);
extern U32 LCDBufferII2[480][640];
// AD转换寄存器定义
define rADCCON (*(volatile unsigned *)0x58000000)
define rADCTSC (*(volatile unsigned *)0x58000004)
define rADCDLY (*(volatile unsigned *)0x58000008)
define rADCDAT0 (*(volatile unsigned *)0x5800000C)
// AD转换控制位定义
define ADCCON_FLAG (0x1 << 15) // 转换结束标志
define ADCCON_ENABLE_START_BYREAD (0x1 << 1) // 通过读操作启动转换
define PRSCVL (49 << 6) // 预分频值
define ADCCON_ENABLE_START (0x1) // 启动转换
define STDBM (0x0 << 2) // 正常模式
define PRSCEN (0x1 << 14) // 预分频使能
// LCD缓冲区指针
extern U16 *pLCDBuffer16I1;
// 初始化AD转换器
void init_ADdevice()
{
rADCCON = (PRSCVL | ADCCON_ENABLE_START | STDBM | PRSCEN);
}
// 获取指定通道的AD转换结果
int GetADresult(int channel)
{
int result;
int i;// 每个通道采样两次,第二次才是有效值(参考原始代码做法) for (i = 0; i <= 1; i++) { // 设置通道并启动转换 rADCCON = ADCCON_ENABLE_START_BYREAD | (channel << 3) | PRSCEN | PRSCVL; hudelay(10); // 等待转换开始 while (!(rADCCON & ADCCON_FLAG)) ; // 等待转换结束 result = (0x3ff & rADCDAT0); // 读取10位采样值(0-1023) } hudelay(50); // 增加通道切换延时,防止通道干扰 return result;
}
// 将AD值(0-1023)转换为0-255范围
unsigned char AD_to_255(int ad_value)
{
return (unsigned char)((ad_value * 255) / 1023);
}
// 将RGB888(0-255)转换为RGB565格式
unsigned short RGB888_to_RGB565(unsigned char r, unsigned char g, unsigned char b)
{
return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3);
}
// 用指定颜色填充全屏
void LCD_FillScreen(unsigned short color)
{
int i;
for (i = 0; i < LCDWIDTH * LCDHEIGHT; i++)
{
*(pLCDBuffer16I1 + i) = color;
}
}
int main(void)
{
int ad_value[3]; // 存储三个通道的AD值
unsigned char r, g, b; // RGB值(0-255)
unsigned short color; // RGB565格式的颜色值ARMTargetInit(); // 系统初始化 LCD_Init(); // LCD初始化 init_ADdevice(); // AD转换器初始化 Uart_Printf(0, "\nAD转换控制LCD颜色显示程序\n"); Uart_Printf(0, "调整电位器可改变屏幕颜色\n\n"); while (1) { // 读取三个通道的AD值 ad_value[0] = GetADresult(0); // 通道0 - 红色(R) ad_value[1] = GetADresult(1); // 通道1 - 绿色(G) ad_value[2] = GetADresult(2); // 通道2 - 蓝色(B) // 将AD值(0-1023)转换为0-255范围 r = AD_to_255(ad_value[0]); g = AD_to_255(ad_value[1]); b = AD_to_255(ad_value[2]); // 将RGB888转换为RGB565格式 color = RGB888_to_RGB565(r, g, b); // 用指定颜色填充全屏 LCD_FillScreen(color); // 打印当前AD值和RGB值 Uart_Printf(0, "\rAD: [%4d, %4d, %4d] RGB: [%3d, %3d, %3d] ", ad_value[0], ad_value[1], ad_value[2], r, g, b); hudelay(100); // 延时,避免刷新过快 } return 0;
}
写课程设计报告