c并口编程
⑴ 求AD0809的c语言并口程序
假设来P0接AD0809
sbit ALE_ST=P1^源0;
sbit EOC=P1^1;
sbit OE=P1^2;
uchar ad0809(void)
{
uchar ad_data;
ALE_ST=0;
ALE_ST=1; //锁存通道地址
ALE_ST=0; //启动AD
while(!EOC){} //等待转化结束
OE=1; //允许输出
ad_data=P0;
OE=0;
ALE_ST=1; //复位寄存器
return ad_data;
}
⑵ C语言如何控制并口引脚
具体没有些过并口的,只熟悉串口.基本上是定义寄存器,一般用#difine宏来写.但是从本人工作来讲,还没写过底层控制,所以了解不是太多.但是看过底层控制代码.
如果想要将引脚进行设置,在C下,一般都是用宏替换的地址来改变.
这些是S3C2410的板卡设置.当中有些是常规写法,有端口的设置..
/********************************************************/
/* */
/* Samsung S3C44B0 */
/* tpu <[email protected]> */
/* */
/********************************************************/
#ifndef __ASM_ARCH_HARDWARE_H
#define __ASM_ARCH_HARDWARE_H
#define REGBASE 0x01c00000
#define REGL(addr) (*(volatile unsigned int *)(REGBASE+addr))
#define REGW(addr) (*(volatile unsigned short *)(REGBASE+addr))
#define REGB(addr) (*(volatile unsigned char *)(REGBASE+addr))
/*****************************/
/* CPU Wrapper Registers */
/*****************************/
#define SYSCFG REGL(0x000000)
#define NCACHBE0 REGL(0x000004)
#define NCACHBE1 REGL(0x000008)
#define SBUSCON REGL(0x040000)
/************************************/
/* Memory Controller Registers */
/************************************/
#define BWSCON REGL(0x080000)
#define BANKCON0 REGL(0x080004)
#define BANKCON1 REGL(0x080008)
#define BANKCON2 REGL(0x08000c)
#define BANKCON3 REGL(0x080010)
#define BANKCON4 REGL(0x080014)
#define BANKCON5 REGL(0x080018)
#define BANKCON6 REGL(0x08001c)
#define BANKCON7 REGL(0x080020)
#define REFRESH REGL(0x080024)
#define BANKSIZE REGL(0x080028)
#define MRSRB6 REGL(0x08002c)
#define MRSRB7 REGL(0x080030)
/*********************/
/* UART Registers */
/*********************/
#define ULCON0 REGL(0x100000)
#define ULCON1 REGL(0x104000)
#define UCON0 REGL(0x100004)
#define UCON1 REGL(0x104004)
#define UFCON0 REGL(0x100008)
#define UFCON1 REGL(0x104008)
#define UMCON0 REGL(0x10000c)
#define UMCON1 REGL(0x10400c)
#define UTRSTAT0 REGL(0x100010)
#define UTRSTAT1 REGL(0x104010)
#define UERSTAT0 REGL(0x100014)
#define UERSTAT1 REGL(0x104014)
#define UFSTAT0 REGL(0x100018)
#define UFSTAT1 REGL(0x104018)
#define UMSTAT0 REGL(0x10001c)
#define UMSTAT1 REGL(0x10401c)
#define UTXH0 REGB(0x100020)
#define UTXH1 REGB(0x104020)
#define URXH0 REGB(0x100024)
#define URXH1 REGB(0x104024)
#define UBRDIV0 REGL(0x100028)
#define UBRDIV1 REGL(0x104028)
/*******************/
/* SIO Registers */
/*******************/
#define SIOCON REGL(0x114000)
#define SIODAT REGL(0x114004)
#define SBRDR REGL(0x114008)
#define ITVCNT REGL(0x11400c)
#define DCNTZ REGL(0x114010)
/********************/
/* IIS Registers */
/********************/
#define IISCON REGL(0x118000)
#define IISMOD REGL(0x118004)
#define IISPSR REGL(0x118008)
#define IISFIFCON REGL(0x11800c)
#define IISFIF REGW(0x118010)
/**************************/
/* I/O Ports Registers */
/**************************/
#define PCONA REGL(0x120000)
#define PDATA REGL(0x120004)
#define PCONB REGL(0x120008)
#define PDATB REGL(0x12000c)
#define PCONC REGL(0x120010)
#define PDATC REGL(0x120014)
#define PUPC REGL(0x120018)
#define PCOND REGL(0x12001c)
#define PDATD REGL(0x120020)
#define PUPD REGL(0x120024)
#define PCONE REGL(0x120028)
#define PDATE REGL(0x12002c)
#define PUPE REGL(0x120030)
#define PCONF REGL(0x120034)
#define PDATF REGL(0x120038)
#define PUPF REGL(0x12003c)
#define PCONG REGL(0x120040)
#define PDATG REGL(0x120044)
#define PUPG REGL(0x120048)
#define SPUCR REGL(0x12004c)
#define EXTINT REGL(0x120050)
#define EXTINPND REGL(0x120054)
/*********************************/
/* WatchDog Timers Registers */
/*********************************/
#define WTCON REGL(0x130000)
#define WTDAT REGL(0x130004)
#define WTCNT REGL(0x130008)
/*********************************/
/* A/D Converter Registers */
/*********************************/
#define ADCCON REGL(0x140000)
#define ADCPSR REGL(0x140004)
#define ADCDAT REGL(0x140008)
/***************************/
/* PWM Timer Registers */
/***************************/
#define TCFG0 REGL(0x150000)
#define TCFG1 REGL(0x150004)
#define TCON REGL(0x150008)
#define TCNTB0 REGL(0x15000c)
#define TCMPB0 REGL(0x150010)
#define TCNTO0 REGL(0x150014)
#define TCNTB1 REGL(0x150018)
#define TCMPB1 REGL(0x15001c)
#define TCNTO1 REGL(0x150020)
#define TCNTB2 REGL(0x150024)
#define TCMPB2 REGL(0x150028)
#define TCNTO2 REGL(0x15002c)
#define TCNTB3 REGL(0x150030)
#define TCMPB3 REGL(0x150034)
#define TCNTO3 REGL(0x150038)
#define TCNTB4 REGL(0x15003c)
#define TCMPB4 REGL(0x150040)
#define TCNTO4 REGL(0x150044)
#define TCNTB5 REGL(0x150048)
#define TCNTO5 REGL(0x15004c)
/*********************/
/* IIC Registers */
/*********************/
#define IICCON REGL(0x160000)
#define IICSTAT REGL(0x160004)
#define IICADD REGL(0x160008)
#define IICDS REGL(0x16000c)
/*********************/
/* RTC Registers */
/*********************/
#define RTCCON REGB(0x170040)
#define RTCALM REGB(0x170050)
#define ALMSEC REGB(0x170054)
#define ALMMIN REGB(0x170058)
#define ALMHOUR REGB(0x17005c)
#define ALMDAY REGB(0x170060)
#define ALMMON REGB(0x170064)
#define ALMYEAR REGB(0x170068)
#define RTCRST REGB(0x17006c)
#define BCDSEC REGB(0x170070)
#define BCDMIN REGB(0x170074)
#define BCDHOUR REGB(0x170078)
#define BCDDAY REGB(0x17007c)
#define BCDDATE REGB(0x170080)
#define BCDMON REGB(0x170084)
#define BCDYEAR REGB(0x170088)
#define TICINT REGB(0x17008c)
/*********************************/
/* Clock & Power Registers */
/*********************************/
#define PLLCON REGL(0x180000)
#define CLKCON REGL(0x180004)
#define CLKSLOW REGL(0x180008)
#define LOCKTIME REGL(0x18000c)
/**************************************/
/* Interrupt Controller Registers */
/**************************************/
#define INTCON REGL(0x200000)
#define INTPND REGL(0x200004)
#define INTMOD REGL(0x200008)
#define INTMSK REGL(0x20000c)
#define I_PSLV REGL(0x200010)
#define I_PMST REGL(0x200014)
#define I_CSLV REGL(0x200018)
#define I_CMST REGL(0x20001c)
#define I_ISPR REGL(0x200020)
#define I_ISPC REGL(0x200024)
#define F_ISPR REGL(0x200038)
#define F_ISPC REGL(0x20003c)
/********************************/
/* LCD Controller Registers */
/********************************/
#define LCDCON1 REGL(0x300000)
#define LCDCON2 REGL(0x300004)
#define LCDSADDR1 REGL(0x300008)
#define LCDSADDR2 REGL(0x30000c)
#define LCDSADDR3 REGL(0x300010)
#define REDLUT REGL(0x300014)
#define GREENLUT REGL(0x300018)
#define BLUELUT REGL(0x30001c)
#define DP1_2 REGL(0x300020)
#define DP4_7 REGL(0x300024)
#define DP3_5 REGL(0x300028)
#define DP2_3 REGL(0x30002c)
#define DP5_7 REGL(0x300030)
#define DP3_4 REGL(0x300034)
#define DP4_5 REGL(0x300038)
#define DP6_7 REGL(0x30003c)
#define LCDCON3 REGL(0x300040)
#define DITHMODE REGL(0x300044)
/*********************/
/* DMA Registers */
/*********************/
#define ZDCON0 REGL(0x280000)
#define ZDISRC0 REGL(0x280004)
#define ZDIDES0 REGL(0x280008)
#define ZDICNT0 REGL(0x28000c)
#define ZDCSRC0 REGL(0x280010)
#define ZDCDES0 REGL(0x280014)
#define ZDCCNT0 REGL(0x280018)
#define ZDCON1 REGL(0x280020)
#define ZDISRC1 REGL(0x280024)
#define ZDIDES1 REGL(0x280028)
#define ZDICNT1 REGL(0x28002c)
#define ZDCSRC1 REGL(0x280030)
#define ZDCDES1 REGL(0x280034)
#define ZDCCNT1 REGL(0x280038)
#define BDCON0 REGL(0x380000)
#define BDISRC0 REGL(0x380004)
#define BDIDES0 REGL(0x380008)
#define BDICNT0 REGL(0x38000c)
#define BDCSRC0 REGL(0x380010)
#define BDCDES0 REGL(0x380014)
#define BDCCNT0 REGL(0x380018)
#define BDCON1 REGL(0x380020)
#define BDISRC1 REGL(0x380024)
#define BDIDES1 REGL(0x380028)
#define BDICNT1 REGL(0x38002c)
#define BDCSRC1 REGL(0x380030)
#define BDCDES1 REGL(0x380034)
#define BDCCNT1 REGL(0x380038)
#define CLEAR_PEND_INT(n) I_ISPC = (1<<(n))
#define INT_ENABLE(n) INTMSK &= ~(1<<(n))
#define INT_DISABLE(n) INTMSK |= (1<<(n))
#define HARD_RESET_NOW()
#endif /* __ASM_ARCH_HARDWARE_H */
具体按照上面I/O设置来编写.
并口
IEEE 1284 Standard在1994年为并口传输定义了5种模式:
1) Compatibility Mode 兼容模式
2) Nibble Mode 半字模式
3) Byte Mode 字节模式
4) EPP 增强型并口模式
5) ECP 扩展并行口
并口的硬件连接器为DB25,被分成了三组,如下图
1) Data lines (data bus) 数据线
2) Control lines 控制线
3) Status lines 状态线
数据线用来传输数据,控制线用来控制外围设备,外围设备通过状态线返回状态信号,这些线分别与内部的数据寄存器,控制寄存器和状态寄存器相连。
DB25管脚信号如下:
Pin No (DB25)
Signal name
Direction
Register - bit
Inverted
1
nStrobe
Out
Control-0
Yes
2
Data0
In/Out
Data-0
No
3
Data1
In/Out
Data-1
No
4
Data2
In/Out
Data-2
No
5
Data3
In/Out
Data-3
No
6
Data4
In/Out
Data-4
No
7
Data5
In/Out
Data-5
No
8
Data6
In/Out
Data-6
No
9
Data7
In/Out
Data-7
No
10
nAck
In
Status-6
No
11
Busy
In
Status-7
Yes
12
Paper-Out
In
Status-5
No
13
Select
In
Status-4
No
14
Linefeed
Out
Control-1
Yes
15
nError
In
Status-3
No
16
nInitialize
Out
Control-2
No
17
nSelect-Printer
Out
Control-3
Yes
18-25
Ground
-
-
-
并口寄存器:
数据,控制,状态线分别与计算机内部相配的寄存器相连,所以可以通过编程来操作这些寄存器,可以通过’C’或者’BASIC’语言轻松读写并口。
标准并口寄存器有:
1) data register 数据寄存器
2) Status register 状态寄存器
3) Control register 控制寄存器
通过写这些寄存器,将在相应线上传输相应的电压信号,可以通过万用表来测量,给并口的这些信号也可以通过这些寄存器读出来,例如:我们写入”1”到数据寄存器,Data0将被提高为+5V电压,这样,我们就可以通过编程打开或关闭数据线或控制线。
这些寄存器在哪里?
在IBM PC中,这些寄存器是IO映射的,并且是唯一的地址,典型的PC上,LPT1的基地址是0x378,LPT2的基地址是0x278,LPT3的基地址是0x3bc。
数据寄存器在基地址上,状态寄存器在基地址+1控制寄存器在基地址+2,因此,当我们一旦知道基地址,我们可以通过计算出其他寄存器的地址
Register
LPT1
LPT2
LPT3
data registar(baseaddress + 0)
0x378
0x278
0x3bc
status register (baseaddress + 1)
0x379
0x279
0x3Bd
control register (baseaddress + 2)
0x37a
0x27a
0x3be
编程规范:
几乎所有的编程语言都提供一些库函数来存取并口,例如:Borland C 提供了"Inportb" 和 "Outportb" 函数去读或写外部设备的IO映射地址。此教程提供了VC的例子,但是很容易移植到其他编译器如:Borland C和TC。VB不直接提供对并口的存取函数,但是可以通过DLL很容易增加这个功能,VC提供两个函数存取外围设备的IO映射,“_inp”读,”_outp”写。这些函数在“conio.h”中声明。
简单硬件测试程序:
VC++范例:
第一步:建立工程:
点完成后在example.cpp中输入代码:
#include "stdafx.h"
#include "conio.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
int main(int argc, char* argv[])
{
short data;
if(argc<2)
{
printf("Usage\n\n");
printf("partest1.exe ,,\n\n\n");
return 0;
}
if(!strcmp(argv[1],"read"))
{
data = _inp(atoi(argv[2]));
printf("Data read from parallel port is ");
printf("%d\n\n\n\n",data);
}
if(!strcmp(argv[1],"write"))
{
_outp(atoi(argv[2]),atoi(argv[3]));
printf("Data written to parallel port is ");
printf("%s\n\n\n\n\n",argv[3]);
}
return 0;
}
编译这个程序,并将其复制到"c:\"
如何测试程序?
连接硬件,打开命令提示框,切换到C: 输入:partest1.exe write 888 255按下回车,如果所有都正确,那么LED1-LED8都会发光,这里的888是0x378,即LPT1的基地址(数据寄存器)。255是写入数据寄存器的数据,如果输入“partest1 read 888”程序将从并口读出数据寄存器的值并显示。